<html>
<script>
// 2016-02-29 18:56PM self-reflection
var x = 10;
foo={
 x:20,
 bar: function() {
     var x = 30;
     return this.x;
  }
}

console.log( 
   foo.bar(),
   (foo.bar)(),
   (foo.bar = foo.bar)(),
   (foo.bar, foo.bar)()
); // 20 20 10 10

function spacify(str) {
      return str.split('').join(' ');
}

console.log(spacify('hello world'));

// 接下来，我会问侯选人，如何把这个方法放入String对象上面，例如：
// 'hello world'.spacify();

String.prototype.spacify = function(){
      return this.split('').join(' ');
    };

console.log('hello ABAP'.spacify());

function log(){
      console.log.apply(console, arguments);
    };

log("Jerry", "2");

/*
我就会说我要改变我调用log的方式，传入多个参数。我会强调我传入参数的个数是不定的，可不止两个。这里我举了一个传两个参数的例子。
好的侯选人知道arugments是一个伪数组，然后会将他转化成为标准数组。通常方法是使用Array.prototype.slice，像这样：

*/
function log(){
      var args = Array.prototype.slice.call(arguments);
      args.unshift('(app)');

      console.log.apply(console, args);
    };

var User = {
  count: 1,

  getCount: function() {
    return this.count;
  }
};

 console.log(User.getCount());
/*
正确的答案是1和undefined。你会很吃惊，因为有很多人被这种最基础的上下文问题绊倒。func是在winodw的上下文中被执行的，所以会访问不到count属性。我向侯选人解释了这点，然后问他们怎么样保证User总是能访问到func的上下文，即返回正即的值：1
*/
    var func = User.getCount;
    console.log(func());
    Function.prototype.bind2 = Function.prototype.bind || function(context){
      var self = this;

      return function(){
        return self.apply(context, arguments);
      };
    }

var func2 = User.getCount.bind2(User);
    console.log(func2());


</script>
</html>
